package Day25;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

/**
 * 服务器
 */
public class Server {
    private final int A = 10086;
    private ExpressDao expressDao = new ExpressDao();

    private ServerSocket server;//服务器

    public static void main(String[] args) {
        Server server=new Server();
        server.start();
    }

    /**
     * 服务器启动
     */
    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    server = new ServerSocket(A);
                    System.out.println("服务器已经准备好！！！服务端口：" + A);
                    //等待客户端的连接
                    while (true) {
                        Socket client = server.accept();//连接服务器的客户端
                        System.out.println("客户端" + client.hashCode() + "连接成功！");
                        //为每个客户端单独开一个线程处理请求
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                //处理客户端的请求：接受客户端的请求--读数据    处理完毕之后将结果响应给客户端端--写数据
                                handlerRequest(client);
                            }
                        }).start();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 处理客户端的请求
     *
     * @param client
     */
    private void handlerRequest(Socket client) {
        //接受客户端的请求--读数据    处理完毕之后将结果响应给客户端端--写数据
        OutputStream out = null;
        ObjectOutputStream objOut = null;
        InputStream in = null;
        ObjectInputStream objIn = null;
        try {
            in = client.getInputStream();
            out = client.getOutputStream();
            objIn = new ObjectInputStream(in);
            objOut = new ObjectOutputStream(out);
            //获取客户端发送的请求类型
            String flag=objIn.readUTF();
            System.out.println("用户请求类型"+flag+"线程"+Thread.currentThread().getName()+"为您服务！");
            if("findAll".equals(flag)){
                //找dao干活得到处理结果
                List<Express> expressList = expressDao.getExpressList();
                //处理完毕之后将结果响应给客户端端--写数据
                if(expressList!=null && expressList.size()!=0)
                    objOut.writeObject(expressList);
                else
                    objOut.writeObject("快递柜中暂时没有任何快递！");
            }else if("add".equals(flag)){
                //获取客户端发送的参数
                Express express= (Express) objIn.readObject();
                //找dao干活得到处理结果
                express = expressDao.add(express);
                //处理完毕之后将结果响应给客户端端--写数据
                objOut.writeObject(express);
            }else if("update".equals(flag)){
                //获取客户端发送的参数
                String number= (String) objIn.readObject();
                Express newExpress= (Express) objIn.readObject();
                //找dao干活得到处理结果
                boolean res = expressDao.update(number,newExpress);
                //处理完毕之后将结果响应给客户端端--写数据
                objOut.writeObject(res);
            }else if("delete".equals(flag)){
                //获取客户端发送的参数
                String number= (String) objIn.readObject();
                //找dao干活得到处理结果
                boolean res = expressDao.del(number);
                //处理完毕之后将结果响应给客户端端--写数据
                objOut.writeObject(res);
            }else if("findByCode".equals(flag)){//用户取件：先查询后删除
                //获取客户端发送的参数
                Integer code= (Integer) objIn.readObject();
                //找dao干活得到处理结果
                Express express = expressDao.findByCodeAndDelExpress(code);
                //处理完毕之后将结果响应给客户端端--写数据
                if(express!=null)
                    objOut.writeObject(express);
                else
                    objOut.writeObject("快递不存在！");
            }else{
                objOut.writeObject("您的请求服务器处理不了！！！");
            }
        } catch (Exception e) {
            e.printStackTrace();
            try {
                objOut.writeObject(e.getMessage());
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        } finally {
            try {
                if (objIn != null)
                    objIn.close();
                if (objOut != null)
                    objOut.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
